package com.yixiu.demo.bio.simpleproxy;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.Socket;

/**
 * Created by jinhe on 2019/3/21.
 * 客户端存根
 */
public class RpcProxyClient<T>  {

    /**
     * 获取一个代理客户端: 代理一个具体的实现类
     * @param clazz
     * @return
     */
    public T proxyClient(Class<T> clazz)  {

        return (T) Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), new InvocationHandler() {

            /**
             * 调用代理的方法
             * @param proxy  代理对象
             * @param method 对象方法
             * @param args 对象参数
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

                try (Socket socket = new Socket("localhost", 8000)) { // 连接远程服务 端口8000
                    try (ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())) { // 获取输出流
                        oos.writeUTF(method.getName()); // 告诉服务端 方法名
                        oos.writeObject(args); // 告诉服务端 参数
                        oos.flush();

                        try (ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {  // 获取输入流
                            return ois.readObject();  // 读取 服务端的返回
                        }
                    }
                }
            }
        });
    }
}
